package cn.gjxblog.validation.hibernate;


import org.hibernate.validator.internal.engine.DefaultParameterNameProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import javax.validation.ParameterNameProvider;
import java.util.Arrays;
import java.util.List;

/**
 * 测试Hibernate Validate校验中核心的类
 *
 * {@link javax.validation.ValidationProviderResolver}
 * 确定运行时整个环境中可用的ValidationProvider列表。
 * 运用SPI机制 ServiceLoader.load( ValidationProvider.class, classloader )
 *
 * {@link javax.validation.spi.ValidationProvider}
 * 校验提供器，Hibernate对它提供了唯一实现类 org.hibernate.validator.HibernateValidator
 *
 *{@link javax.validation.metadata.ConstraintDescriptor}
 * 约束描述符,描述单个约束或者组合（composing）约束，这个描述非常的重要，
 * 到这里就把约束的注解、Groups、Payloads、getAttributes等等都关联起来了，它就是个metadata
 *
 * {@link javax.validation.MessageInterpolator}
 * 插值器不好理解，简单的说就是对message内容进行格式化，若有占位符{}或者el表达式就执行替换和计算。对于语法错误应该尽量的宽容。
 *
 * {@link javax.validation.TraversableResolver}
 * 可移动的处理器 它的意思从字面是非常不好理解，我用粗暴的语言解释为：确定某个属性是否能被ValidationProvider访问
 *
 * {@link javax.validation.ConstraintValidatorFactory}
 *校验器工厂
 *
 * {@link javax.validation.ParameterNameProvider}
 * 参数名提供器 提供方法、构造函数的入参names们。逻辑比较简单~
 *
 * {@link javax.validation.ClockProvider}
 * 这个接口很简单，就是提供一个Clock，给@Past、@Future等判断作为参考
 *
 * {@link javax.validation.valueextraction.ValueExtractor}
 * 值提取器，值提取器，蛮重要的，从容器内把值提取处理啊
 *
 * {@link javax.validation.ValidatorFactory}
 * 验证器工厂，在准备好了一个javax.validation.Configuration后，接下来最重要的事就是根据配置Configuration拿到一个ValidatorFactory，进而拿到javax.validation.Validator完成校验~
 *
 * {@link javax.validation.Validator}
 * 验证器
 *
 *
 */
@RunWith(JUnit4.class)
public class TestValidateCoreClass {

    @Test
    public void test(){
        DefaultParameterNameProvider parameterNameProvider = new DefaultParameterNameProvider();

        // 拿到Person的无参构造和有参构造（@NoArgsConstructor和@AllArgsConstructor）
        Arrays.stream(Person.class.getConstructors()).forEach(c -> {
            List<String> parameterNames = parameterNameProvider.getParameterNames(c);
            System.out.println(parameterNames);
        });
    }
}
